(()=>{
  // 1、布尔
  // let boolean:boolean = 1 < 2
  // console.log(boolean)

  // 2、数字
  // let num:number = 123

  // 3、字符串
  // let str:string = '123'

  // 4、undefined、null  特殊：可以作为所有类型的子类型来使用,如果编译时报错，需将tsconfig.json的严格检查模式关闭
  // let text:undefined = undefined
  // let text2:null = null
  // boolean = text
  // boolean = text2

  // 5、数组 例：只接受数字类型元素
  // let arr:number[] = [1,2,3]  //第一种定义方式： 元素类型[]
  // let arr:Array<number> = [1,2,3] //第二种：使用数组泛型 Array<元素类型>

  // 6、元组 表示一个已知数量、类型的数组（赋值时的数量、类型必须与定义完全一致），各元素间不必相同
  // let t:[string,number,boolean]
  // t = ['123',123,1<2,1] //不符合
  // t = [123,123,1<2]  //不符合

  // 7、枚举 默认按元素位置从零开始依次编号，编号可手动更改，可通过编号查找到对应元素
  // enum persons{
  //   zs,
  //   ls,
  //   ww = 8,
  //   cl
  // }
  // console.log(persons.ls)//1
  // console.log(persons.cl)//9
  // console.log(persons[8])//ww

  // 8、any 任意类型 例可接收任何参数的数组 :any[]或Array<any>
  // let hh:any = 123
  // hh = '123'
  // hh = false

  // 9、void 空类型 用来表示一个没有任何返回值的函数
  // function fun():void{
  //   // return '123'//错误
  // }

  // 10、object 例：参数必须为对象，返回值必须为对象类型很少用
  // 用例一
  // function fun(agm:object):object{
  //   console.log(agm)
  //   return {}
  // }
  // fun(new Number('122'))

  // 用例二
  // let a : {name:string} // 声明几个属性在使用时只能使用声明的属性，多|少都不可以
  // a = {name:'',age:10} //不能将类型“{ name: string; age: number; }”分配给类型“{ name: string; }”。对象文字可以只指定已知属性，并且“age”不在类型“{ name: string; }”中
  // let a : {name:string,[propName:string]:any} // 代表 除了name必须使用外，还可以使用任意多个值为任意类型的属性
  // a = {name:'',age:18,sex:''} 
  // 11、联合类型 通过 | 连接，类似于或的意思 类型1 | 类型2

  // 12、类型断言 明确告诉编译器是什么类型 （<string>agm）或 (agm as string)
  // function fun(agm:string|number){
  //   if((<string>agm).length){
  //     return (agm as string).length
  //   }else{
  //     return agm.toString().length
  //   }
  // }
  // console.log(fun(999))

  // 13、类型推断  编译器自动根据定义时的赋值推断出最终类型，如果定义时未赋值，推断为any
  // let aa = 123 //自动推断为number
  // aa = '' //错误

  // 14、字面量 未来赋值只能是字面量本身，可以结合联合类型做精确限制
  // let a:"男"|"女"
  // a="男"
  // a="女"
  // a="" //不能将类型“""”分配给类型“"男" | "女"”

  // 15、unknown 与any类似，安全类型any，区别:不能直接将unknown类型的变量赋值给其他类型，any可以
  // let a : string
  // let b : unknown
  // let e
  // e = true
  // b = 0
  // // a = e // 注意：此时的a实际已经被赋值为true了，这也是不建议使用any的原因之一
  // // a = b //不能将类型“unknown”分配给类型“string”
  // // typeof b === 'string'? a = b : '' // 想赋值需加判断 或 
  // // 类型断言 a = b as string 同样需要注意，类型断言后TS将不进行语法检查，如上，b被赋值为number也不会报错提示
  console.log(999)

  // 16、type 声明类型别名
  // type myType = 1 | 2 | 3 | 4 | 5
  // type myType2 = 6 | 7 | 8 | 9 | 10
  // let a :myType
  // let b : myType2
  // let c :myType
  // let d : myType2

  
})()